package student;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
/*创建连接 localhost:1433;DatabaseName=数据库名
sql中的？代表占位符，  预处理执行器特有
填充数据库
添加到数据表
exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
返回
* */
public class StudentDao {
    /**
     * public class是JAVA定义的
     * 一般占到编程的角度来将就是包含main方法的
     * 一个java文件中。
     * Java是一门面向对象编程语言
     * 不仅吸收了C++语言的各种优点
     * 还摒弃了C++里难以理解的多继承、指针等概念，
     * 因此Java语言具有功能强大和简单易用两个特征
     * 。Java语言作为静态面向对象编程语言的代表，
     * 极好地实现了面向对象理论，
     * 允许程序员以优雅的思维方式进行复杂的编程。
     * @param slist
     * @throws SQLException
     */
    public void insertAll(List<StudentPojo> slist) throws SQLException {

        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有

        for (int i = 1; i < slist.size(); i++) {
            //for循环
            StudentPojo item = slist.get(i);
            //数据库
            String sql = "insert into student(sno, sname, sdate, sex, sgrade, career, cid) values(?, ?, ?, ?, ?, ?, ?)";
            PreparedStatement ps = conn.prepareStatement(sql);
            // 填充第几个？
            ps.setString(1, item.getSno());
            //将1添加到sno
            ps.setString(2, item.getSname());
            //将2添加到Sname
            System.out.println(item.getSdate());
            //添加到数据表
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date d = null;
            //数值为空
            try {
                d = sdf.parse(item.getSdate());
                //在数据表中
            } catch (ParseException e) {
                e.printStackTrace();
                //打印表
            }
            //数据
            Date d1 = new Date(d.getTime());
            ps.setDate(3, d1);
            //添加数据(3, d1)
            ps.setString(4, item.getSex());
            //将4添加到Sex
            ps.setInt(5, item.getSgrade());
            //将5添加到Sgrade
            ps.setString(6, item.getCareer());
            //将6添加到Career
            ps.setInt(7, item.getCid());
            //将7添加到Cid
            // 3
            // exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
            int rs = ps.executeUpdate();
        }

        conn.close();
        //结束

    }

    /*创建连接 localhost:1433;DatabaseName=数据库名
    sql中的？代表占位符，  预处理执行器特有
    填充数据库
    添加到数据表
    返回
    * */
    public int deleteBySno(String sno) throws SQLException {
        /**
         * 对于这个int，
         * 由于有public修饰，
         * 所以这个变量对于所有类都是可见的，
         * 没有访问的限制。
         * static，其实就是一个静态变量的意思。
         * 用static修饰的变量又叫类变量，他有很多特性，现在列出来。
         * public static int a，
         * 对于这个变量，首先他不需要一个实例化对象，
         * 也就是说不需要new对象就可以用类名+变量名来访问这个变量，
         * 当然要看访问修饰符的限制。
         * 其次，这个变量是一个全局的变量，
         * 就是这个对象被该类的其他所有对象共有。
         */
        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有
        String sql = "delete from Student where sno = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        // 填充第几个？
        ps.setString(1, sno);

        // 填充(1, sno)
        // exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
        int rs = ps.executeUpdate();


        conn.close();
        //结束
        return rs;
        //返回
    }

    /*创建连接 localhost:1433;DatabaseName=数据库名
        sql中的？代表占位符，  预处理执行器特有
        填充数据库
        添加到数据表
        返回
        * */
    public List<StudentPojo> findStudentClassByCid(int cid) throws SQLException {
        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有
        String sql = "select sno,sname,sdate,sex,sgrade,career,cid\n" +
                "from Student\n" +
                "where cid= ?";

        PreparedStatement ps = conn.prepareStatement(sql);
        // 填充第几个？
        ps.setInt(1, cid);

        // 填充(1, cid)
        ArrayList<StudentPojo> slist = new ArrayList<>();
        /**
         * ArrayList是一个动态数组，
         * 也是我们常用的集合，
         * 它允许任何元素的插入，
         * 甚至包括null。
         * 每一个ArrayList都有一个初始化的容量(10)，
         * 该容量代表了数组的大小，
         * 随着容器中容量的不断增加，
         * 容器的大小也会随着增加。
         * 在每次向容器中增加元素时，
         * 会进行容量检查，
         * 当快溢出时，会进行扩容操作。
         * 允许插入的元素重复
         * 插入的元素是有序的
         * 动态扩容
         * 非线程安全，异步
         * 基于动态数组的数据结构
         * 擅长随机访问(get set)
         */
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            //while函数
            StudentPojo pojo = new StudentPojo();
            slist.add(pojo);
            //添加数据
            pojo.setSno(rs.getString(1));
            //添加1到Sno
            pojo.setSname(rs.getString(2));
            //添加2到Sname
            pojo.setSdate(rs.getString(3));
            //添加3到Sdate
            pojo.setSex(rs.getString(4));
            //添加4到Sex
            pojo.setSgrade(rs.getInt(5));
            //添加5到Sgrade
            pojo.setCareer(rs.getString(6));
            //添加6到Career
            pojo.setCid(rs.getInt(7));
            //添加7到Cid

        }
        conn.close();
        //结束
        return slist;
        //返回
    }

    /*创建连接 localhost:1433;DatabaseName=数据库名
    sql中的？代表占位符，  预处理执行器特有
    填充数据库
    添加到数据表
    返回
    * */
    public int updateBySno(String sno, int sgrade) throws SQLException {
        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有
        String sql = "update Student \n" +
                "set sgrade= ?\n" +
                "where sno= ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        // 填充第几个？
        ps.setInt(1, sgrade);
        //填充(1, sgrade)
        ps.setString(2, sno);
        //填充(2, sno)

        // 3
        // exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
        int rs = ps.executeUpdate();

        conn.close();
        //关闭
        return rs;
        //返回
    }

    /*public ResultSet selectBySname(String sname) throws SQLException {

            // 2. 创建连接 localhost:1433;DatabaseName=数据库名
            Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
            // sql中的？代表占位符，  预处理执行器特有
            String sql = "select sno,sname,sdate,sex,sgrade,career,cid\n" +
                    "from Student\n" +
                    "where sname=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            // 填充第几个？
            ps.setString(1, sname);


            // 3
            // exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
            ResultSet rs = ps.executeQuery();


            conn.close();
            return rs;
        }*/
    }



